<!DOCTYPE html>
<html lang="zh-cn">
<head>

    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />

    
    
        <meta name="twitter:card" content="summary"/>
    



<meta name="twitter:title" content="用树莓派搭建私有git服务器"/>
<meta name="twitter:description" content=""/>
<meta name="twitter:site" content="@"/>



  	<meta property="og:title" content="用树莓派搭建私有git服务器 &middot; FNL" />
  	<meta property="og:site_name" content="FNL" />
  	<meta property="og:url" content="http://blog.im404.me/post/old/raspberrypi-ngrok-gogs/" />

    
        
            <meta property="og:image" content="/images/cover.jpg"/>
        
    

    
    <meta property="og:description" content="" />
  	<meta property="og:type" content="article" />
    <meta property="article:published_time" content="2016-10-29T15:10:26&#43;08:00" />

    
    

    <title>用树莓派搭建私有git服务器 &middot; FNL</title>

    
    <meta name="description" content="&lt;p&gt;最近发现了&lt;a href=&#34;gogs.io&#34;&gt;gogs&lt;/a&gt;，是一个类似github的私有git仓库管理程序。正好这官方是支持树莓派的，那就来试一下吧。&lt;/p&gt;" />
    

    <meta name="HandheldFriendly" content="True" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <link rel="shortcut icon" href="http://blog.im404.me/images/favicon.ico">
	  <link rel="apple-touch-icon" href="http://blog.im404.me/images/apple-touch-icon.png" />

    <link rel="stylesheet" type="text/css" href="http://blog.im404.me/css/screen.css" />
    <link rel="stylesheet" type="text/css" href="http://blog.im404.me/css/nav.css" />

    

    

    
      
          <link href="http://blog.im404.me/index.xml" rel="alternate" type="application/rss+xml" title="FNL" />
      
      
    
    <meta name="generator" content="Hugo 0.26" />

    <link rel="canonical" href="http://blog.im404.me/post/old/raspberrypi-ngrok-gogs/" />

    
      
    
    <script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "Article",
    "publisher": {
        "@type": "Organization",
        "name": ,
        "logo": http://blog.im404.me/images/logo.ico
    },
    "author": {
        "@type": "Person",
        "name": ,
        
        "image": {
            "@type": "ImageObject",
            "url": http://blog.im404.me/images/logo.ico,
            "width": 250,
            "height": 250
        }, 
        
        "url": http://blog.im404.me,
        "sameAs": [
            
            
             
             
             
             
             
            
        ]
    },
    "headline": 用树莓派搭建私有git服务器,
    "name": 用树莓派搭建私有git服务器,
    "wordCount": 236,
    "timeRequired": "PT2M",
    "inLanguage": {
      "@type": "Language",
      "alternateName": en
    },
    "url": http://blog.im404.me/post/old/raspberrypi-ngrok-gogs/,
    "datePublished": 2016-10-29T15:10Z,
    "dateModified": 2016-10-29T15:10Z,
    
    
    "description": ,
    "mainEntityOfPage": {
        "@type": "WebPage",
        "@id": http://blog.im404.me/post/old/raspberrypi-ngrok-gogs/
    }
}
    </script>
    


    

    

    
</head>
<body class="nav-closed">

  <div class="nav">
    <h3 class="nav-title">Menu</h3>
    <a href="#" class="nav-close">
        <span class="hidden">Close</span>
    </a>
    <ul>
        
        
        
            
            <li class="nav-opened" role="presentation">
            	<a href="http://blog.im404.me/about/">关于</a>
            </li>
        
            
            <li class="nav-opened" role="presentation">
            	<a href="http://blog.im404.me/">文章</a>
            </li>
        
        
    </ul>

    
    <a class="subscribe-button icon-feed" href="http://blog.im404.me/index.xml">Subscribe</a>
    
</div>
<span class="nav-cover"></span>


 <div class="site-wrapper">



<header class="main-header post-head no-cover">
  <nav class="main-nav clearfix">


  
      <a class="blog-logo" href="http://blog.im404.me/"><img src="http://blog.im404.me/images/logo.ico" alt="Home" /></a>
  
  
      <a class="menu-button" href="#"><span class="burger">&#9776;</span><span class="word">Menu</span></a>
  
  </nav>
</header>



<main class="content" role="main">




  <article class="post post">

    <header class="post-header">
        <h1 class="post-title">用树莓派搭建私有git服务器</h1>
        <small></small>

        <section class="post-meta">
        
          <time class="post-date" datetime="2016-10-29T15:10:26&#43;08:00">
            Oct 29, 2016
          </time>
        
         
        </section>
    </header>

    <section class="post-content">
      <p>最近发现了<a href="gogs.io">gogs</a>，是一个类似github的私有git仓库管理程序。正好这官方是支持树莓派的，那就来试一下吧。</p>

<h1 id="为什么是gogs">为什么是gogs</h1>

<p>之前我也用过gitlab，因为是在一台空出来的32位atom笔记本上安装，恰巧gitlab官方早已不支持32位的直接安装包，所以为了能够用上也就只能从源码编译了。结果是用了整整一个周末来编译完成，虽然功能非常齐全（除了没有page），但是用起来有点卡。<br />
相比之下，gogs是用go语言写的，所以整个程序就是一个编译好的二进制文件，下载下来配置好数据库就能直接用，还支持主流操作系统和处理器架构。<br />
总结下来就是，安装简单，跑起来还不卡。</p>

<h1 id="怎么装gogs">怎么装gogs</h1>

<p>安装gogs其实很简单</p>

<h2 id="安装好数据库和ssh服务器以及git">安装好数据库和ssh服务器以及git</h2>

<p><code>sudo apt-get install mysql-server openssh-server git</code></p>

<h2 id="创建一个git用户">创建一个git用户</h2>

<p><code>sudo useradd git</code>切换到git用户<code>su git</code>，并创建好<code>.ssh</code>文件夹。</p>

<h2 id="挂载硬盘-可选">挂载硬盘(可选)</h2>

<p>我的树莓派的sd卡是16g的，如果用户多了肯定装不下，而且我还想用树莓派来做个备份用的服务器。<br />
将硬盘用usb和树莓派链接后（注意电源），先分好区，再挂载，我这里是160g的硬盘，因此我就粗暴的将硬盘分为100G的<code>/dev/sda1</code>和60G的<code>/dev/sda2</code>。
分区完毕后就将分区及硬盘挂载点写到<code>/etc/fstab/</code>里面。
<code>/etc/fstab</code>添加如下几行</p>

<pre><code>    /dev/sda1   /home/git/gogs-repositories auto auto 0 2
    /dev/sda2   /home/mnt/sync              auto auto 0 2
</code></pre>

<p>可以看到我直接将100G直接挂到了gogs的仓库目录，而60G则挂到了<code>/mnt/sync</code>。</p>

<h2 id="到gogs的官网下载二进制包">到gogs的官网下载二进制包</h2>

<p>下载地址在<a href="https://gogs.io/docs/installation/install_from_binary">这里</a><br />
下载raspberrypi v2(写这篇文的时间是2016-10-29)，不管你的树莓派是什么型号的，都应该用这个版本，v2只代表编译版本(?)，并不代表树莓派型号。
解压完毕后执行<code>mysql -u root -p &lt; /path/to/gogs/scripts/mysql.sql</code>创建好数据库。然后登录到mysql里面，创建一个<code>gogs</code>用户，将刚创建好的数据库<code>gogs</code>的所有权限赋予<code>gogs</code>这个用户。</p>

<pre><code>    $ mysql -u root -p
    &gt; # （输入密码）
    &gt; create user 'gogs'@'localhost' identified by '密码';
    &gt; grant all privileges on gogs.* to 'gogs'@'localhost';
    &gt; flush privileges;
    &gt; exit;
</code></pre>

<h2 id="配置gogs">配置gogs</h2>

<p>进入到gogs的目录里面，执行<code>./gogs web</code>，填写好需要的表单就可以了。默认是没有任何用户的，配置完成后注册的第一个用户就是管理员。</p>

<h2 id="关闭ssh的密码验证">关闭ssh的密码验证</h2>

<p>在本机生成一个rsa密钥并将公钥复制到树莓派的<code>/home/pi/.ssh/authorized_keys</code>里面。
然后最好在本机的<code>~/.ssh/config</code>中添加一个<code>host</code>，比如：</p>

<pre><code>host raspberrypi
    hostname [youRaspberrypi]
    user pi
    identityfile ~/.ssh/id_rsa
</code></pre>

<p>这样一来，在终端运行<code>ssh raspberrypi</code>的时候可以通过生成的密钥来登录了。
登录到树莓派上，修改<code>/etc/ssh/sshd_config</code>,将<code>PasswordAuthentication yes</code>这一行的<code>yes</code>改为<code>no</code>，保存后重启<code>ssh</code>服务：<code>sudo service ssh restart</code></p>

<h2 id="nginx反向代理">nginx反向代理</h2>

<p>在gogs,默认的web监听端口位3000,当然你也可以修改这个端口，但是如果在同一台服务器上部署了多个网站，那么就需要配置一个反向代理来通过不同的域名或路径来指向不同的网站。
运行<code>sudo apt-get install nginx</code>安装好nginx后，修改<code>/etc/nginx/sites-available/default</code>，添加如下代码</p>

<pre><code>    location /gogs/{
        proxy_pass http://localhost:3000/;
    }
</code></pre>

<p>在这里我用了/gogs/路径来访问gogs,如果你想直接通过80端口访问gogs,将<code>locaiton</code>后面的<code>/gogs/</code>改为<code>/</code>即可。</p>

<h1 id="将树莓派暴露到外网">将树莓派暴露到外网</h1>

<p>一般来说这一步可以用花生壳之类的动态域名加上端口映射来解决，无奈我树莓派是放在宿舍里面的，路由器上获取到的是内网的ip,所以动态域名是不行的。花生壳的内网服务因为有流量限制我又不太想用，经过一番搜素之后我找到了ngrok。</p>

<h2 id="什么是ngok">什么是ngok?</h2>

<p>ngrok 是一个反向代理，通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。</p>

<h2 id="在vps上搭建一个ngrok服务端">在vps上搭建一个ngrok服务端</h2>

<p>在毕业之前我买了台用来搭梯子的国外vps，月流量有1T之多，一个人肯定是用不完的，正好拿来挂网站。
首先，先安装好编译要用的工具<br />
<code>sudo apt-get install build-essential golang mercurial git</code>
装完之后先运行<code>go version</code>来看看go的版本，最好是<code>1.7</code>以上的版本，因为如果用的是比较旧的版本的话可能会出错，如果安装的版本比较旧，那自行谷歌官网下载安装吧。
然后获取ngrok源码
<code>git clone https://github.com/tutumcloud/ngrok.git ngrok</code>
<code>cd ngrok</code>
生成证书并编译</p>

<pre><code>NGROK_DOMAIN=&quot;gogs.im404.me&quot;
openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 10000 -subj &quot;/CN=$NGROK_DOMAIN&quot; -out base.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj &quot;/CN=$NGROK_DOMAIN&quot; -out server.csr
openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt

cp base.pem assets/client/tls/ngrokroot.crt
</code></pre>

<p>开始编译：
<code>#make release-server release-client</code>
没有报错的话，在<code>ngrok/bin</code>文件夹下会生成<code>ngrok</code>(客户端),和<code>ngrokd</code>(服务端)。
但是到这一步还没结束，因为树莓派是arm架构的，所以还需要为树莓派编译一个客户端：
<code>#GOOS=linux GOARCH=arm make release-client</code>
然后在<code>ngrok/bin/</code>下就会看到新的文件夹<code>linux_arm</code>里面的<code>ngrok</code>就是树莓派的客户端了，将这个文件复制到树莓派上吧。</p>

<h2 id="将泛域名指向vps">将泛域名指向vps</h2>

<p>比如我现在拥有的域名为<code>im404.me</code>，vps的ip为<code>8.8.8.8</code>，那么我需要在域名服务商那里添加一条A记录，将<code>*</code>指向<code>8.8.8.8</code>。这样一来所有为指明的子域名如<code>fxxk.im404.me</code>或<code>sxxk.im404.me</code>都会解析为<code>8.8.8.8</code>。</p>

<h2 id="运行服务端和客户端">运行服务端和客户端</h2>

<p>在vps上运行起ngrok服务端：
<code>#./path/to/ngrok/bin/ngrokd -tlsKey=/path/to/ngrok/server.crt -domain=&quot;gogs.im404.me&quot;</code>
在树莓派上先要写一个配置文件，比如我将配置文件命名为<code>ngrok.cfg</code></p>

<pre><code>trust_host_root_certs: false
server_addr: &quot;gogs.im404.me:4443&quot;
tunnels:
http:
    proto:
        http: 80    #直接将本机的80端口转发到服务端的80端口
            subdomain: gogs
ssh:
    proto:
        tcp: 22
            remote_port: 8181   #git需要用到ssh，所以将本地的ssh端口转发到服务端的8181端口
</code></pre>

<p>然后在树莓派上运行
<code>./path/to/ngrok -config=/path/to/ngrok.cfg http ssh start</code></p>

<p>然后在浏览器上打开<code>gogs.im404.me/gogs</code>，成功！（因为写这篇文的时候我已经将服务撤下来了，所以已经看不到了）。</p>

<h1 id="后话">后话</h1>

<p>因为vps是在国外，ping在好的情况下也有160+，所以一来一回大概是300左右，但是网站有html代码，css样式还有一堆图片，所以打开到加载完成需要几秒钟。。给同事看看的时候他说“我打开是空白的所以就直接关掉了”。<br />
所以我还是撤了下来，树莓派就好好做个下载机吧。</p>

<h1 id="参考文章">参考文章</h1>

<p><a href="https://mynook.info/blog/post/host-your-own-git-server-using-gogs">使用Gogs搭建自己的Git服务器</a><br />
<a href="https://imququ.com/post/self-hosted-ngrokd.html">搭建ngrok服务实现内网穿透</a></p>
    </section>


  <footer class="post-footer">


    








<figure class="author-image">
    <a class="img" href="http://blog.im404.me/" style="background-image: url(/images/logo.ico)"><span class="hidden">fjmax's Picture</span></a>
</figure>


<section class="author">
  <h4><a href="http://blog.im404.me/">fjmax</a></h4>
  
  <p>Read <a href="http://blog.im404.me/">more posts</a> by this author.</p>
  
  <div class="author-meta">
    
    <span class="author-link icon-link"><a href="http://blog.im404.me">http://blog.im404.me</a></span>
  </div>
</section>




    
<section class="share">
  <h4>Share this post</h4>
  <a class="icon-twitter" style="font-size: 1.4em" href="https://twitter.com/share?text=%e7%94%a8%e6%a0%91%e8%8e%93%e6%b4%be%e6%90%ad%e5%bb%ba%e7%a7%81%e6%9c%89git%e6%9c%8d%e5%8a%a1%e5%99%a8&nbsp;-&nbsp;FNL&amp;url=http%3a%2f%2fblog.im404.me%2fpost%2fold%2fraspberrypi-ngrok-gogs%2f"
      onclick="window.open(this.href, 'twitter-share', 'width=550,height=235');return false;">
      <span class="hidden">Twitter</span>
  </a>
  <a class="icon-facebook" style="font-size: 1.4em" href="https://www.facebook.com/sharer/sharer.php?u=http%3a%2f%2fblog.im404.me%2fpost%2fold%2fraspberrypi-ngrok-gogs%2f"
      onclick="window.open(this.href, 'facebook-share','width=580,height=296');return false;">
      <span class="hidden">Facebook</span>
  </a>
  <a class="icon-pinterest" style="font-size: 1.4em" href="http://pinterest.com/pin/create/button/?url=http%3a%2f%2fblog.im404.me%2fpost%2fold%2fraspberrypi-ngrok-gogs%2f&amp;description=%e7%94%a8%e6%a0%91%e8%8e%93%e6%b4%be%e6%90%ad%e5%bb%ba%e7%a7%81%e6%9c%89git%e6%9c%8d%e5%8a%a1%e5%99%a8"
      onclick="window.open(this.href, 'pinterest-share','width=580,height=296');return false;">
      <span class="hidden">Pinterest</span>
  </a>
  <a class="icon-google-plus" style="font-size: 1.4em" href="https://plus.google.com/share?url=http%3a%2f%2fblog.im404.me%2fpost%2fold%2fraspberrypi-ngrok-gogs%2f"
     onclick="window.open(this.href, 'google-plus-share', 'width=490,height=530');return false;">
      <span class="hidden">Google+</span>
  </a>
</section>



    

<div id="disqus_thread"></div>
<script>




var disqus_config = function () {
this.page.url = "http:\/\/blog.im404.me\/post\/old\/raspberrypi-ngrok-gogs\/";  
this.page.identifier = "http:\/\/blog.im404.me\/post\/old\/raspberrypi-ngrok-gogs\/"; 
};

(function() { 
var d = document, s = d.createElement('script');
s.src = 'https://fjmax.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>








  </footer>
</article>

</main>


  <aside class="read-next">
  
      <a class="read-next-story" style="no-cover" href="http://blog.im404.me/post/old/LifeCount2016/">
          <section class="post">
              <h2>LifeCount・2016</h2>
              
          </section>
      </a>
  
  
      <a class="read-next-story prev" style="no-cover" href="http://blog.im404.me/post/old/wechat-sign-in/">
          <section class="post">
              <h2>微信二维码签到的另一种玩法</h2>
          </section>
      </a>
  
</aside>



    <footer class="site-footer clearfix">
        <section class="copyright"><a href="">FNL</a> All rights reserved - 2016</section>
        
        <section class="poweredby">Proudly generated by <a class="icon-hugo" href="http://gohugo.io">HUGO</a>, with <a class="icon-theme" href="https://github.com/vjeantet/hugo-theme-casper">Casper</a> theme</section>
        
    </footer>
    </div>
    <script type="text/javascript" src="http://blog.im404.me/js/jquery.js"></script>
    <script type="text/javascript" src="http://blog.im404.me/js/jquery.fitvids.js"></script>
    <script type="text/javascript" src="http://blog.im404.me/js/index.js"></script>
    
</body>
</html>

